package net.inteidee.bean.entity;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;

@Entity
public class Ruolo {
	
	@Id @GeneratedValue
	protected long id;
	protected String nomeRuolo;
	protected Boolean stato;
	
	@Embedded
	protected MyLogging myLogging;
	
	
	@OneToMany(fetch = FetchType.EAGER, mappedBy = "ruolo" , cascade = CascadeType.ALL)	
	protected Set<RuoloApplicazioneOperazione> ruoloApplicazioneOperaziones = new HashSet<RuoloApplicazioneOperazione>();
	
	@OneToMany(fetch = FetchType.EAGER, mappedBy = "ruolo")	
	protected Set<UtenteRuolo> ruoliUtenti = new HashSet<UtenteRuolo>();

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getNomeRuolo() {
		return nomeRuolo;
	}

	public void setNomeRuolo(String nomeRuolo) {
		this.nomeRuolo = nomeRuolo;
	}

	public Boolean getStato() {
		return stato;
	}

	public void setStato(Boolean stato) {
		this.stato = stato;
	}

	public MyLogging getMyLogging() {
		return myLogging;
	}

	public void setMyLogging(MyLogging myLogging) {
		this.myLogging = myLogging;
	}

	public Set<UtenteRuolo> getRuoliUtenti() {
		return ruoliUtenti;
	}

	public void setRuoliUtenti(Set<UtenteRuolo> ruoliUtenti) {
		this.ruoliUtenti = ruoliUtenti;
	}

	
	public Set<RuoloApplicazioneOperazione> getRuoloApplicazioneOperaziones() {
		return ruoloApplicazioneOperaziones;
	}

	public void setRuoloApplicazioneOperaziones(
			Set<RuoloApplicazioneOperazione> ruoloApplicazioneOperaziones) {
		this.ruoloApplicazioneOperaziones = ruoloApplicazioneOperaziones;
	}

	/**
	 * Aggiunge una entri alla relazione ternaria
	 * @param applicazione  agganciata al ruolo
	 * @param operazione aggenciata all' applicazione
	 */
	public void addApplicazioneOperazione(Applicazione applicazione,Operazione operazione){
		
		RuoloApplicazioneOperazione ruoloApplicazioneOperazione =new RuoloApplicazioneOperazione();
		ruoloApplicazioneOperazione.setRuolo(this);
		ruoloApplicazioneOperazione.setApplicazione(applicazione);
		ruoloApplicazioneOperazione.setOperazione(operazione);
		ruoloApplicazioneOperaziones.add(ruoloApplicazioneOperazione);
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + (int) (id ^ (id >>> 32));
		result = prime * result
				+ ((myLogging == null) ? 0 : myLogging.hashCode());
		result = prime * result
				+ ((nomeRuolo == null) ? 0 : nomeRuolo.hashCode());
		result = prime * result + ((stato == null) ? 0 : stato.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Ruolo other = (Ruolo) obj;
		if (id != other.id)
			return false;
		if (myLogging == null) {
			if (other.myLogging != null)
				return false;
		} else if (!myLogging.equals(other.myLogging))
			return false;
		if (nomeRuolo == null) {
			if (other.nomeRuolo != null)
				return false;
		} else if (!nomeRuolo.equals(other.nomeRuolo))
			return false;
		if (stato == null) {
			if (other.stato != null)
				return false;
		} else if (!stato.equals(other.stato))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return nomeRuolo;
				
	}

	
	
}